iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 10
0
Modern Web

從零開始進入 JavaScript & TypeScript 的世界系列 第 10

第10天-優雅的建構子存取修飾符

  • 分享至 

  • xImage
  •  

在昨天我們介紹了建構子(Constructor)與存取修飾符(Access Modifiers)之後,今天要來介紹的是,TypeScript 如何用更優雅的方式來給予建構子裡面的私有或公有成員(private/public member)預設值。

我們昨天的例子是:

class Rectangle {
    private width: number;
    private length: number;

    constructor(width: number, length: number) {
        this.width = width;
        this.length = length;
    }
    //...以下省略
}

// 建立物件同時給予 width 及 length 初始化
let rect = new Rectangle(10, 12);

其中在建構子的部分,相信有人一定會覺得下面這一段寫得很囉唆。

private width: number;
private length: number;

constructor(width: number, length: number) {
    this.width = width;
    this.length = length;
}

this.width = width 這個部份說的是把外面傳進來的參數(width)賦值給 class 內部宣告的私有成員 width。同理, length 也是一樣的意思。因為這樣寫真的有一些囉唆,所以 TypeScript 就增加了一個很優雅的宣告及初始化方式,我們只要將建構子改成下面這樣,他的效果就會等同於上面那樣。

constructor(private width: number, private length: number){}

在上面那個例子中,我們只要在建構子的參數位置 前方 加上 privatepublic ,TypeScript 就會自動幫我們宣告成為私有或公開的成員並且賦值給他。也就是說我們在建構子中寫 private name:string 就等於於之前的寫法:先宣告一個 private name; 接著在建構子中加入一個參數 name:string,最後在建構子的實作中將 this.name = name; 賦值。

而這個建構子參數前的存取修飾符可以是 public 也可以是 private。

所以如果我們這樣寫(在參數後面加上 ?),這樣的寫法就等同於建構子的參數可有可無,然後他還會宣告兩個 private member,分別是 width 和 length。

class Rectangel {
    constructor(private width?: number, private length?: number)

    showWidthAndLength():void {
        console.log('width is ' + width, 'length is ' + length);
    }
}

// 以下兩種都是合法的
let rect1 = new Rectangle(2, 5);
let rect2 = new Rectangle();

結論

TypeScript 提供了更優雅的方式讓我們可以透過建構子來宣告私有/公有成員,並且給予初始化的機會,不用在寫很多囉唆的程式碼。


上一篇
第09天-建構子(Constructor)與存取修飾符(Access modifier)
下一篇
第11天-一樣優雅的屬性(Property)
系列文
從零開始進入 JavaScript & TypeScript 的世界30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言